package com.mrjoew.wechat.entities.xml.in;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;

/**
 * @author vioao
 */
@Data
@JacksonXmlRootElement(localName = "xml")
public class InMessage {

    ///////////////////////
    // 以下都是微信推送过来的消息的xml的element所对应的属性.
    ///////////////////////
    @JacksonXmlProperty(localName = "ToUserName")
    private String toUserName;

    @JacksonXmlProperty(localName = "FromUserName")
    private String fromUserName;

    @JacksonXmlProperty(localName = "CreateTime")
    private Long createTime;

    @JacksonXmlProperty(localName = "MsgType")
    private String msgType;

    @JacksonXmlProperty(localName = "MsgId")
    private String msgId;

    @JacksonXmlProperty(localName = "Event")
    private String event;

    @JacksonXmlProperty(localName = "EventKey")
    private String eventKey;

    @JacksonXmlProperty(localName = "Content")
    private String content;

    @JacksonXmlProperty(localName = "PicUrl")
    private String picUrl;

    @JacksonXmlProperty(localName = "MediaId")
    private String mediaId;

    @JacksonXmlProperty(localName = "Format")
    private String format;

    @JacksonXmlProperty(localName = "ThumbMediaId")
    private String thumbMediaId;

    @JacksonXmlProperty(localName = "LocationX")
    private String locationX;

    @JacksonXmlProperty(localName = "LocationY")
    private String locationY;

    @JacksonXmlProperty(localName = "Scale")
    private String scale;

    @JacksonXmlProperty(localName = "Label")
    private String label;

    @JacksonXmlProperty(localName = "Title")
    private String title;

    @JacksonXmlProperty(localName = "Description")
    private String description;

    @JacksonXmlProperty(localName = "Url")
    private String url;

    @JacksonXmlProperty(localName = "Ticket")
    private String ticket;

    @JacksonXmlProperty(localName = "Latitude")
    private String latitude;

    @JacksonXmlProperty(localName = "Longitude")
    private String longitude;

    @JacksonXmlProperty(localName = "Precision")
    private String precision;

    @JacksonXmlProperty(localName = "Recognition")
    private String recognition;

    @JacksonXmlProperty(localName = "MenuId")
    private String menuId;

    ///////////////////////////////////////
    // 群发消息返回的结果
    ///////////////////////////////////////

    // 群发的结果
    private String status;

    // group_id下粉丝数；或者openid_list中的粉丝数.
    private Integer totalCount;

    // 过滤（过滤是指特定地区、性别的过滤、用户设置拒收的过滤，用户接收已超4条的过滤）后，准备发送的粉丝数
    // 原则上，filterCount = sentCount + errorCount
    private Integer filterCount;
    // 发送成功的粉丝数
    private Integer sentCount;

    // 发送失败的粉丝数
    private Integer errorCount;

    ///////////////////////////////////////
    // 客服会话管理相关事件推送
    ///////////////////////////////////////

    // 创建或关闭客服会话时的客服帐号
    private String kfAccount;

    // 转接客服会话时的转入客服帐号
    private String toKfAccount;

    // 转接客服会话时的转出客服帐号
    private String fromKfAccount;

    ///////////////////////////////////////
    // 门店审核事件推送
    ///////////////////////////////////////

    // 商户自己内部ID，即字段中的sid
    private String storeUniqId;

    // 微信的门店ID，微信内门店唯一标示ID
    private String poiId;

    // 审核结果，成功succ 或失败fail
    private String result;

    // 成功的通知信息，或审核失败的驳回理由
    private String msg;

    ///////////////////////////////////////
    // 微信认证事件推送
    ///////////////////////////////////////
    /**
     * ExpiredTime
     * 资质认证成功/名称认证成功: 有效期 (整形)，指的是时间戳，将于该时间戳认证过期.
     * 年审通知: 有效期 (整形)，指的是时间戳，将于该时间戳认证过期，需尽快年审.
     * 认证过期失效通知: 有效期 (整形)，指的是时间戳，表示已于该时间戳认证过期，需要重新发起微信认证.
     */
    private Long expiredTime;

    // 失败发生时间 (整形)，时间戳
    private Long failTime;

    // 认证失败的原因
    private String failReason;
}
